iT邦幫忙

2021 iThome 鐵人賽

DAY 2
1

這次只有針對 RV31I 指令做解碼,
原本希望能讓這次加入的 INSTRUCTION_DECODER_INTERFACE 更有擴充性,
可以更方便的支援其他指令集,
參考過 RISC-V-TLM,覺得把解碼邏輯都堆在 CPU 不是很好,
但是暫時沒想到更好的做法,只能先放到 Decoder 中。

RV32I Base Instruction

RV32I 指令集的指令分成 R、I、S、U、B、J 幾種格式,
並且讓 rs1, rs2, rd 的位置盡量保持一致,
以減少解碼的複雜度。
另外為了硬體設計考量,Immediate 值的永遠都是 Sign Extended,
而且最高位都放在最高位 (MSB),
這樣就可以在 Instruction Decode 也同時做 Sign Extension。

另外也在規格書 2.2 節討論到 Alignment 的問題,
特別值得一提的是 JUMP、BRANCH 指令跳到未對齊(Misalignment)的位置執行,
會在原指令發生 Exception,但是如果沒跳就什麼都不會發生。

實際程式

github 頁面 Tag: ITDay9

INSTRUCTION_DECODER_INTERFACE 留下了針對 RV32I 指令集的解碼方式,
不夠抽象化,但太鑽牛角尖會拖慢開發進度,
目前以完成 RV32I 指令集為最優先考量,
並且讓介面保留能加入少量擴充指令集又不會難以維護的彈性,
之後支援更多指令集時需要重新設計。

class INSTRUCTION_DECODER_INTERFACE
{
public:
	enum ExtensionType {
		BASE_RV32I,
		UNSUPPORTED,
	};

	void set_instruction(uint32_t value)
...

	INSTRUCTION_DECODER_INTERFACE::ExtensionType extension()
...

	virtual uint32_t get_opcode() = 0;
	virtual uint32_t get_func3() = 0;
	virtual uint32_t get_func7() = 0;

	virtual uint32_t get_rs1() = 0;
	virtual uint32_t get_rs2() = 0;
	virtual uint32_t get_rd() = 0;

	virtual uint32_t get_imm(uint32_t start, uint32_t end) = 0;

protected:
	sc_dt::sc_uint<32> instruction_value;
};

shared_ptr 和做 interface 的理由和之前一樣,不再贅述。


上一篇
RISC-V: 記憶體提前亮相
下一篇
RISC-V: 作為第一道指令的聰明選擇
系列文
猴子都寫得出來的 RISC-V CPU Emulator31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言